"""
只要是有序序列，都可以解包，比如元祖，列表，字符串，文件，迭代器，生成器
参数个数要一致,如果参数不一致，需要用*组包
组包可以解决元素长度不定的情况，将长度不确定的N个元素使用*组包到一个列表中
"""
#元祖解包
x,y=(4,5)
print(f"x={x},y={y}")
#列表解包
data=["ACME",50,91.1,(2012,12,21)]
name,shares,price,date=data
print(f"name={name},shares={shares},price={price},date={date}")

#字符串解包
a,b,c,d,e="hello"
print(f"a={a},b={b},c={c}.d={d},e={e}")

#生成器解包
x,y,z,m,n=range(-4,1)
print(f"x={x},y={y},z={z},m={m},n={n}")

#去掉第一个数和最后一个数，对中间的数做平均
def avg(lst):
    return sum(lst)/len(lst)

def drop_first_last(grades):
    first,*middle,last=grades
    return avg(middle)

grades=[1,2,3,4,5,6,7,8,9]
print(drop_first_last(grades))


#假设有一些用户，记录由姓名和电子邮件地址组成，后面跟着任意数量的电话号码

record=["Dave","dave@example.com","777-333-666","888-9999-123"]
name,email,*phone_numbers=record
print(phone_numbers)

#在迭代中使用*迭代变长的元祖序列
records=[("foo",1,2),("bar","hello"),("foo",2,3,4),("bar","python,java")]

def do_foo(*args):
    print(f"foo,{args}")

def do_bar(*args):
    print(f"bar,{args}")

#该for循环包括解包和组包两个过程
for tag,*args in records:
    if tag=="foo":
        do_foo(args)
    elif tag=="bar":
        do_bar(args)


#组包解包和split结合
line="nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false"
uname,*fields,homedir,sh=line.split(":")
print(fields)

#解包组包后想丢弃某些元素,从一堆序列中提取某些重要的元素,比如从下面的可变数组中提取出姓名和出生年份
new_record=["ACME",50,91.1,(2012,12,21)]
new_name,*_,(new_year,*_)=new_record
print(f"new_name={new_name},new_year={new_year}")



